package framework;
import java.io.IOException;
import java.util.Properties;

import javax.mail.Flags;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.NoSuchProviderException;
import javax.mail.Session;
import javax.mail.Store;

import junit.framework.Assert;

/** Позволяет работать с почтой gmail
 */
public class GmailUtils{

	private Logger logger = Logger.getInstance();
	private Properties props = System.getProperties();
	private final String folderName = "Inbox";
	private final long oneSecond = 1000;
	private final int twoMins = 120000;

	/** Возвращает письмо с указанной темой с почтового ящика
	 * @param username имя почтового ящика
	 * @param password пароль
	 * @param expectedMessageSubject ожидаемая тема сообщения
	 * @return содержимое письма
	 */
	@SuppressWarnings("null")
	public String readerMessageFromSender(String username, String password, String expectedMessageSubject){
			Store store = initializeConnection(username, password);
			String messageContent = null;
			//Проверка, что соединение установлено
			Assert.assertNotNull("Не удалось установить соединения с почтовым ящиком.",store);
			try{
				Folder inbox = store.getFolder(folderName);
				inbox.open(Folder.READ_WRITE);
				//Получаем все сообщения из папки
				Message[] messages;
				int counter = 0;
				// В течении 2 минут ждем прихода письма,
				// когда письмо приходит - выходим из цикла
				do{
					try {
						Thread.sleep(oneSecond);
						counter++;
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					messages = inbox.getMessages();
					if(counter == twoMins){
						break;
					}
				}while(messages.length == 0);
				for(Message message:messages) {
					logger.info("Адрес отправителя: " + message.getFrom()[0].toString() + "");
					if(message.getFrom()[0].toString().equals(expectedMessageSubject)){
						try{
							messageContent = message.getContent().toString();
							logger.info("Содержимое письма: " + messageContent);
						}catch(IOException e){
							logger.error("Не удалось прочитать сообщение: " + e.getMessage());
						}
						//Удаление сообщения после прочтения
						message.setFlag(Flags.Flag.DELETED, true);
						return messageContent;
					}
				}
				if(messageContent.equals(null)) {
					logger.warn("Сообщение c темой: '" + expectedMessageSubject + "' не найдено");
				}
				return messageContent;
			}catch(MessagingException e){
				logger.fatal("Ошибка чтения сообщения.");
				return null;
			}catch (NullPointerException e) {
				logger.fatal("Сообщение о подтверждении регистрации не пришло на электронный ящик: " + username);
				return null;
			}
	}

	/** Удаляет все сообщения с ящика
	 * @param username название почтового ящика
	 * @param password пароль к п/я
	 */
	public void deleteAllMessages(String username, String password){
		Store store = initializeConnection(username, password);
		//Проверка, что соединение установлено
		Assert.assertNotNull("Не удалось установить соединения с почтовым ящиком.",store);
		try{
			Folder inbox = store.getFolder(folderName);
			inbox.open(Folder.READ_WRITE);
			//Получаем все сообщения из папки
			Message[] messages = inbox.getMessages();
			for(Message message:messages) {
				message.setFlag(Flags.Flag.DELETED, true);
			}
			inbox = store.getFolder(folderName);
			inbox.open(Folder.READ_WRITE);
			//Проверяем что все сообщения удалены
			Assert.assertEquals("Все сообщения не были удалены.", 0, inbox.getMessageCount());
			logger.info("Все сообщения были успешно удалены.");
		}catch(MessagingException e){
			logger.error("Ошибка чтения сообщения: " + e.getMessage());
		}
	}

	/** Выполняет подключение к почтовому ящику
	 * @param username имя
	 * @param password пароль
	 * @return подключение
	 */
	private Store initializeConnection(String username, String password){
		props.setProperty("mail.store.protocol", "imaps");
		Store store  = null;
		//Устанвливаем содинение с ящиком
		Session session = Session.getDefaultInstance(props, null);
		try{
			store = session.getStore("imaps");
			try {
				store.connect("imap.gmail.com", username, password);
			} catch (MessagingException e) {
				logger.error("Ошибка подклчения: " + e.getMessage());
			}
		}catch(NoSuchProviderException e){
			logger.error("Не удалось подключиться к почтовому ящику: " + e.getMessage());
		}
		return store;
	}
}
